package org.opsli.modulars.business.iot.protocol;

import com.alibaba.fastjson.JSON;

import java.math.BigDecimal;
import java.util.HashMap;
import java.util.Map;

public class ReadZb {


    //解析信息
    public static Map getZb1(String s){
        Map map=new HashMap<>();
        s=s.toUpperCase();
        //开头
        String s1=s.substring(0,6);
        System.out.println(s1);
        //MAC地址
        String s2=s.substring(6,18);
        System.out.println(s2);
        //获取设备编号,mac地址
       /* byte[] bytes=ConvertCode.hexString2Bytes(s2);
        String devid="";
        for(int i=0;i<=5;i++){
            devid=devid+BCDToStr(bytes[i]);
        }
        System.out.println(devid);*/
        map.put("mac",s2);
        //IP地址
        String s3=s.substring(18,78);
        System.out.println(s3);
        String ip=StringToAscii.hex2Str(s3);
        System.out.println(ip);
        map.put("ip",ip);
        //端口
        String s4=s.substring(78,82);
        System.out.println(s4);
        Integer port=covert(s4);
        System.out.println(port);
        map.put("port",port);
        //apn
        String s5=s.substring(82,122);
        System.out.println(s5);
        String apn=StringToAscii.hex2Str(s5);
        System.out.println(apn);
        map.put("apn",apn);
        //采集周期
        String s6=s.substring(122,126);
        System.out.println(s6);
        String cjmin=s6.substring(2,4);
        System.out.println(cjmin);
        map.put("cjmin",cjmin);
        //浓度上传周期
        String s7=s.substring(126,134);
        System.out.println(s7);
        Integer scmin=Integer.valueOf(s7);
        System.out.println(scmin);
        map.put("scmin",scmin);
        return map;
    }


    //解析485信息
    public static Map getZb4851(String s){
        System.out.println("Z4851="+s);
        Map map=new HashMap<>();
        s=s.toUpperCase();
        //开头
        String s1=s.substring(0,6);
        System.out.println(s1);
        //MAC地址
        String s2=s.substring(6,18);
        System.out.println(s2);
        //获取设备编号,mac地址
       /* byte[] bytes=ConvertCode.hexString2Bytes(s2);
        String devid="";
        for(int i=0;i<=5;i++){
            devid=devid+BCDToStr(bytes[i]);
        }
        System.out.println(devid);*/
        map.put("mac",s2);
        //IP地址
        String s3=s.substring(18,78);
        System.out.println(s3);
        String ip=StringToAscii.hex2Str(s3);
        System.out.println(ip);
        map.put("ip",ip);
        //端口
        String s4=s.substring(78,82);
        System.out.println(s4);
        Integer port=covert(s4);
        System.out.println(port);
        map.put("port",port);
        //apn
        String s5=s.substring(82,122);
        System.out.println(s5);
        String apn=StringToAscii.hex2Str(s5);
        System.out.println(apn);
        map.put("apn",apn);
        //采集周期
        String s6=s.substring(122,126);
        System.out.println(s6);
        Integer cjmin=covert(s6);
        System.out.println(cjmin);
        map.put("cjmin",cjmin);
        //浓度上传周期
        String s7=s.substring(126,130);
        System.out.println(s7);
        Integer scmin=covert(s7);
        System.out.println(scmin);
        map.put("scmin",scmin);
        //mqttIP
        String s8=s.substring(130,190);
        String mqttip=StringToAscii.hex2Str(s8);
        System.out.println(mqttip);
        map.put("mqttip",mqttip);
        //mqttPORT
        String s9=s.substring(190,194);
        Integer mqttport=covert(s9);
        map.put("mqttport",mqttport);
        return map;
    }


    //解析485第二部分信息
    public static Map getZb4852(String s){
        System.out.println("Z4852="+s);
        Map map=new HashMap<>();
        s=s.toUpperCase();
        //开头
        String s1=s.substring(0,6);
        System.out.println(s1);
        //4g信号值
        String s2=s.substring(6,10);
        Integer data1=covert(s2);
        map.put("data1",data1);
        //程序版本号
        String s3=s.substring(10,14);
        map.put("data2",s3);
        //普通485版本号
        String s4=s.substring(14,18);
        Integer data3=covert(s4);
        map.put("data3",data3);
        //AI型配置版本号
        String s5=s.substring(18,22);
        Integer data4=covert(s5);
        map.put("data4",data4);
        //组合型485配置版本号
        String s6=s.substring(22,26);
        Integer data5=covert(s6);
        map.put("data5",data5);

        //普通485变量数
        String s7=s.substring(26,30);
        Integer data6=covert(s7);
        map.put("data6",data6);
        //AI型配置变量数
        String s8=s.substring(30,34);
        Integer data7=covert(s8);
        map.put("data7",data7);
        //组合型485变量数
        String s9=s.substring(34,38);
        Integer data8=covert(s9);
        map.put("data8",data8);

        return map;
    }

    //解析信息
    public static Map getZb2(String s){
        Map map=new HashMap<>();
        s=s.toUpperCase();
        //开头
        String s1=s.substring(0,6);
        System.out.println(s1);
        //工作模式
        String s8=s.substring(6,10);
        System.out.println(s8);
        DevAlarm devAlarm=BitUtil.getAlarm(s8);
        map.put("bbit0",devAlarm.getBit0());
        map.put("bbit1",devAlarm.getBit1());
        map.put("bbit2",devAlarm.getBit2());
        map.put("bbit3",devAlarm.getBit3());
        map.put("bbit4",devAlarm.getBit4());
        map.put("bbit5",devAlarm.getBit5());
        //手机号1
        String s9=s.substring(10,34);
        System.out.println(s9);
        String phone1=StringToAscii.hex2Str(s9);
        map.put("phone1",phone1);
        //手机号2
        String s10=s.substring(34,58);
        System.out.println(s10);
        String phone2=StringToAscii.hex2Str(s10);
        map.put("phone2",phone2);
        //手机号3
        String s11=s.substring(58,82);
        System.out.println(s11);
        String phone3=StringToAscii.hex2Str(s11);
        map.put("phone3",phone3);
        //手机号4
        String s12=s.substring(82,106);
        System.out.println(s12);
        String phone4=StringToAscii.hex2Str(s12);
        map.put("phone4",phone4);
        //手机号5
        String s13=s.substring(106,130);
        System.out.println(s13);
        String phone5=StringToAscii.hex2Str(s13);
        map.put("phone5",phone5);
        //校时
        String s14=s.substring(130,142);
        System.out.println(s14);
        String time="20"+s14.substring(0,2)+"-"+s14.substring(2,4)+"-"+s14.substring(4,6)+" "+s14.substring(6,8)+":"+s14.substring(8,10)+":"+s14.substring(10,12);
        map.put("time",time);
        System.out.println(time);
        //0%LELAD 值
        String s15=s.substring(142,146);
        System.out.println(s15);
        Integer lelad1=covert(s15);
        System.out.println(lelad1);
        map.put("lelad1",lelad1);
        //20%LELAD 值
        String s16=s.substring(146,150);
        System.out.println(s16);
        Integer lelad2=covert(s16);
        System.out.println(lelad2);
        map.put("lelad2",lelad2);
        //50%LELAD 值
        String s17=s.substring(150,154);
        System.out.println(s17);
        Integer lelad3=covert(s17);
        System.out.println(lelad3);
        map.put("lelad3",lelad3);
        //报警值
        String s18=s.substring(154,158);
        System.out.println(s18);
        devAlarm=new DevAlarm();
        devAlarm=BitUtil.getAlarm(s18);
        map.put("bit0",devAlarm.getBit0());
        map.put("bit1",devAlarm.getBit1());
        map.put("bit2",devAlarm.getBit2());
        map.put("bit3",devAlarm.getBit3());
        map.put("bit4",devAlarm.getBit4());
        map.put("bit5",devAlarm.getBit5());
        map.put("bit6",devAlarm.getBit6());
        map.put("bit7",devAlarm.getBit7());
        map.put("bit8",devAlarm.getBit8());
        //电池电压
        String s19=s.substring(158,162);
        System.out.println(s19);
        BigDecimal a1=new BigDecimal(s19.substring(0,2));
        BigDecimal a2=new BigDecimal(s19.substring(2,4));
        BigDecimal a3=new BigDecimal("100");
        BigDecimal a4=a2.divide(a3);
        //电压
        double d=(a1.add(a4)).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
        System.out.println(d);
        map.put("dy",d);
        //版本号
        String s20=s.substring(162,166);
        System.out.println(s20);
        map.put("version",s20);
        return map;
    }

    //解析信息
    public static Map getZb22(String s){
        Map map=new HashMap<>();
        s=s.toUpperCase();
        //开头
        String s1=s.substring(0,6);
        System.out.println(s1);
        //工作模式
        String s8=s.substring(6,10);
        System.out.println(s8);
        DevAlarm devAlarm=BitUtil.getAlarm(s8);
        map.put("bbit0",devAlarm.getBit0());
        map.put("bbit1",devAlarm.getBit1());
        map.put("bbit2",devAlarm.getBit2());
        map.put("bbit3",devAlarm.getBit3());
        map.put("bbit4",devAlarm.getBit4());
        map.put("bbit5",devAlarm.getBit5());
        //手机号1
        String s9=s.substring(10,34);
        System.out.println(s9);
        String phone1=StringToAscii.hex2Str(s9);
        map.put("phone1",phone1);
        //手机号2
        String s10=s.substring(34,58);
        System.out.println(s10);
        String phone2=StringToAscii.hex2Str(s10);
        map.put("phone2",phone2);
        //手机号3
        String s11=s.substring(58,82);
        System.out.println(s11);
        String phone3=StringToAscii.hex2Str(s11);
        map.put("phone3",phone3);
        //手机号4
        String s12=s.substring(82,106);
        System.out.println(s12);
        String phone4=StringToAscii.hex2Str(s12);
        map.put("phone4",phone4);
        //手机号5
        String s13=s.substring(106,130);
        System.out.println(s13);
        String phone5="";
        try {
            phone5=Integer.valueOf(s13)+"";
        }catch (Exception e){

        }
        map.put("phone5",phone5);
        //校时
        String s14=s.substring(130,142);
        System.out.println(s14);
        String time="20"+s14.substring(0,2)+"-"+s14.substring(2,4)+"-"+s14.substring(4,6)+" "+s14.substring(6,8)+":"+s14.substring(8,10)+":"+s14.substring(10,12);
        map.put("time",time);
        System.out.println(time);
        //0%LELAD 值
        String s15=s.substring(142,146);
        System.out.println(s15);
        Integer lelad1=covert(s15);
        System.out.println(lelad1);
        map.put("lelad1",lelad1);
        //20%LELAD 值
        String s16=s.substring(146,150);
        System.out.println(s16);
        Integer lelad2=covert(s16);
        System.out.println(lelad2);
        map.put("lelad2",lelad2);
        //50%LELAD 值
        String s17=s.substring(150,154);
        System.out.println(s17);
        Integer lelad3=covert(s17);
        System.out.println(lelad3);
        map.put("lelad3",lelad3);
        //报警值
        String s18=s.substring(154,158);
        System.out.println(s18);
        devAlarm=new DevAlarm();
        devAlarm=BitUtil.getAlarm(s18);
        map.put("bit0",devAlarm.getBit0());
        map.put("bit1",devAlarm.getBit1());
        map.put("bit2",devAlarm.getBit2());
        map.put("bit3",devAlarm.getBit3());
        map.put("bit4",devAlarm.getBit4());
        map.put("bit5",devAlarm.getBit5());
        map.put("bit6",devAlarm.getBit6());
        map.put("bit7",devAlarm.getBit7());
        map.put("bit8",devAlarm.getBit8());
        //电池电压
        String s19=s.substring(158,162);
        System.out.println(s19);
        BigDecimal a1=new BigDecimal(s19.substring(0,2));
        BigDecimal a2=new BigDecimal(s19.substring(2,4));
        BigDecimal a3=new BigDecimal("100");
        BigDecimal a4=a2.divide(a3);
        //电压
        double d=(a1.add(a4)).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
        System.out.println(d);
        map.put("dy",d);
        //版本号
        String s20=s.substring(162,166);
        System.out.println(s20);
        map.put("version",s20);
        return map;
    }




    public static void main(String[] args){
        Map map=getZb22("00035000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002209201010490000001400190000000000313A6A");
        System.out.println(JSON.toJSONString(map));
        /*String s="0003900020210800013130332E34362E3132382E32310000000000000000000000000000000000E102636D6E6574000000000000000000000000000000000200000530003E000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000210903182937001000100010004803590025041A";*/
       /* String s="0103400000000000003131372e3135382e3230342e3130300000000000000000000000000000002718000000000000000000000000000000000000000000200000003014b5";
        System.out.println(s.length());
        Map map=new HashMap<>();
        //开头
        String s1=s.substring(0,6);
        System.out.println(s1);
        //MAC地址
        String s2=s.substring(6,18);
        System.out.println(s2);
        //获取设备编号,mac地址
        byte[] bytes=ConvertCode.hexString2Bytes(s2);
        String devid="";
        for(int i=0;i<=5;i++){
            devid=devid+BCDToStr(bytes[i]);
        }
        System.out.println(devid);
        map.put("mac",devid);
        //IP地址
        String s3=s.substring(18,78);
        System.out.println(s3);
        String ip=StringToAscii.hex2Str(s3);
        System.out.println(ip);
        map.put("ip",ip);
        //端口
        String s4=s.substring(78,82);
        System.out.println(s4);
        Integer port=covert(s4);
        System.out.println(port);
        map.put("port",port);
        //apn
        String s5=s.substring(82,122);
        System.out.println(s5);
        String apn=StringToAscii.hex2Str(s5);
        System.out.println(apn);
        map.put("apn",apn);
        //采集周期
        String s6=s.substring(122,126);
        System.out.println(s6);
        String cjmin=s6.substring(2,4);
        System.out.println(cjmin);
        map.put("cjmin",cjmin);
        //浓度上传周期
        String s7=s.substring(126,134);
        System.out.println(s7);
        String scmin=s7.substring(6,8);
        System.out.println(scmin);
        map.put("scmin",scmin);*/
        /*//工作模式
        String s8=s.substring(134,138);
        System.out.println(s8);
        DevAlarm devAlarm=BitUtil.getAlarm(s8);
        map.put("bbit0",devAlarm.getBit0());
        map.put("bbit1",devAlarm.getBit1());
        map.put("bbit2",devAlarm.getBit2());
        map.put("bbit3",devAlarm.getBit3());
        map.put("bbit4",devAlarm.getBit4());
        map.put("bbit5",devAlarm.getBit5());
        //手机号1
        String s9=s.substring(138,162);
        System.out.println(s9);
        String phone1=StringToAscii.hex2Str(s9);
        map.put("phone1",phone1);
        //手机号2
        String s10=s.substring(162,186);
        System.out.println(s10);
        String phone2=StringToAscii.hex2Str(s10);
        map.put("phone2",phone2);
        //手机号3
        String s11=s.substring(186,210);
        System.out.println(s11);
        String phone3=StringToAscii.hex2Str(s11);
        map.put("phone3",phone3);
        //手机号4
        String s12=s.substring(210,234);
        System.out.println(s12);
        String phone4=StringToAscii.hex2Str(s12);
        map.put("phone4",phone4);
        //手机号5
        String s13=s.substring(234,258);
        System.out.println(s13);
        String phone5=StringToAscii.hex2Str(s13);
        map.put("phone5",phone5);
        //校时
        String s14=s.substring(258,270);
        System.out.println(s14);
        String time="20"+s14.substring(0,2)+"-"+s14.substring(2,4)+"-"+s14.substring(4,6)+" "+s14.substring(6,8)+":"+s14.substring(8,10)+":"+s14.substring(10,12);
        map.put("time",time);
        System.out.println(time);
        //0%LELAD 值
        String s15=s.substring(270,274);
        System.out.println(s15);
        Integer lelad1=covert(s15);
        System.out.println(lelad1);
        map.put("lelad1",lelad1);
        //20%LELAD 值
        String s16=s.substring(274,278);
        System.out.println(s16);
        Integer lelad2=covert(s16);
        System.out.println(lelad2);
        map.put("lelad2",lelad2);
        //50%LELAD 值
        String s17=s.substring(278,282);
        System.out.println(s17);
        Integer lelad3=covert(s17);
        System.out.println(lelad3);
        map.put("lelad3",lelad3);
        //报警值
        String s18=s.substring(282,286);
        System.out.println(s18);
        devAlarm=new DevAlarm();
        devAlarm=BitUtil.getAlarm(s18);
        map.put("bit0",devAlarm.getBit0());
        map.put("bit1",devAlarm.getBit1());
        map.put("bit2",devAlarm.getBit2());
        map.put("bit3",devAlarm.getBit3());
        map.put("bit4",devAlarm.getBit4());
        map.put("bit5",devAlarm.getBit5());
        map.put("bit6",devAlarm.getBit6());
        map.put("bit7",devAlarm.getBit7());
        map.put("bit8",devAlarm.getBit8());
        //电池电压
        String s19=s.substring(286,290);
        System.out.println(s19);
        BigDecimal a1=new BigDecimal(s19.substring(0,2));
        BigDecimal a2=new BigDecimal(s19.substring(2,4));
        BigDecimal a3=new BigDecimal("100");
        BigDecimal a4=a2.divide(a3);
        //电压
        double d=(a1.add(a4)).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
        System.out.println(d);
        map.put("dy",d);
        //版本号
        String s20=s.substring(290,294);
        System.out.println(s20);
        map.put("version",s20);*/

    }

    /**

     * @功能: BCD码转为10进制串(阿拉伯数据)

     * @参数: BCD码

     * @结果: 10进制串

     */

    public static String BCDToStr(byte bcd) {

        int a = (bcd >> 4);
        int b = bcd & 0x0f;
        String s=String.valueOf(a) + String.valueOf(b);
        return s.replace("-","");
    }

    /**
     * @param: [content]
     * @return: int
     * @description: 十六进制转十进制
     */
    public static int covert(String content){
        int number=0;
        String [] HighLetter = {"A","B","C","D","E","F"};
        Map<String,Integer> map = new HashMap<>();
        for(int i = 0;i <= 9;i++){
            map.put(i+"",i);
        }
        for(int j= 10;j<HighLetter.length+10;j++){
            map.put(HighLetter[j-10],j);
        }
        String[]str = new String[content.length()];
        for(int i = 0; i < str.length; i++){
            str[i] = content.substring(i,i+1);
        }
        for(int i = 0; i < str.length; i++){
            number += map.get(str[i])*Math.pow(16,str.length-1-i);
        }
        return number;
    }

    public static String change(int n) {
        if (n < 0)

            return "-" + change(-n);

        if (n < 16) {
            return "0123456789ABCDEF".charAt(n) + "";

        } else {
            return change(n / 16) + change(n % 16);

        }
    }
}
